/*
 * DatosMensajeFactory.h
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef DATOSMENSAJEFACTORY_H_
#define DATOSMENSAJEFACTORY_H_

#include "MensajesCommonTypes.h"
#include "DatosMensaje.h"

#include "../../Modelo/Common/Flota.h"

#include "../../../Framework/Common/TemplateSingleton.h"

#include "DatosCambiarRumboAvisoDestino.h"
#include "DatosCambiarRumboAvisoJugador.h"
#include "DatosCambiarRumboOrden.h"
#include "DatosCambiaDuenio.h"
#include "DatosCrearFlotaOrden.h"
#include "DatosCrearFlotaAvisoDestino.h"
#include "DatosCrearFlotaAvisoJugador.h"
#include "DatosArriboNave.h"
#include "DatosCantidadNaves.h"
#include "DatosInicioJuego.h"
#include "DatosFinJuego.h"
#include "DatosAbandonaJugador.h"
#include "DatosUnirAUniverso.h"
#include "DatosCrearUniverso.h"
#include "DatosUnidoAUniverso.h"
#include "DatosCreadoUniverso.h"

namespace aplicacion {

//DatosMensajeFactory es un singleton
class DatosMensajeFactory;
typedef SingletonTemplate<DatosMensajeFactory> DatosMensajeFactorySingleton;

/**
 * Permite crear un objeto de tipo DatosMensaje
 */
class DatosMensajeFactory : private Singleton {

//------------------------------ CONSTANTES ------------------------------
public:
	typedef enum contexto_datosMsjFactory
	{
		CONTEXTO_JUGADOR,
		CONTEXTO_PLANETA
	} contexto_datosMsjFactory;

//------------------------------ ATRIBUTOS ------------------------------
private:
	/** indica el contexto en cual se encuentra la factory
	 * segun las constantes definidas.
	 * Segun el contexto se decidira en algunos casos que tipo de instancia se
	 * devuelve.
	 */
	int _contexto;

//------------------------------ METODOS ------------------------------
public:
	/* FIXME esto no deberia ser publico por ser singleton, pero dada la implementacion
	 * que use de singleton no supe como redefinir el constructor sin hacerlo publico */
	DatosMensajeFactory();
	virtual ~DatosMensajeFactory();

	void setContexto (const contexto_datosMsjFactory& contexto);

	std::string getContextoAsString();

	/**
	 * Permite crear una instancia de datos de mensaje segun el tipo
	 * indicado
	 */
	DatosMensaje* create(t_tipoMensaje tipoCrear);

	DatosCambiarRumboOrden* createCambiarRumboOrden();

	/** Si la flota es null, se asocia una nueva al mensaje, sino se asocia la indicada) */
	DatosCambiarRumboAvisoDestino* createCambiarRumboAvisoDestino(Flota* flotaDatos = NULL);
	DatosCambiarRumboAvisoJugador* createCambiarRumboAvisoJugador(Flota* flotaDatos = NULL);
	DatosCambiaDuenio* createCambiaDuenio();
	DatosCrearFlotaOrden* createCrearFlotaOrden();
	DatosCrearFlotaAvisoDestino* createCrearFlotaAvisoDestino();
	DatosCrearFlotaAvisoJugador* createCrearFlotaAvisoJugador();
	DatosArriboNave* createArriboNave();
	DatosCantidadNaves* createCantidadNaves();
	DatosInicioJuego* createInicioJuego();
	DatosFinJuego* createFinJuego();
	DatosAbandonaJugador* createAbandonaJugador();
	DatosUnirAUniverso* createUnirAUniverso();
	DatosCrearUniverso* createCrearUniverso();
	DatosUnidoAUniverso* createUnidoAUniverso();
	DatosCreadoUniverso* createCreadoUniverso();

};

} //namespace aplicacion

#endif /* DATOSMENSAJEFACTORY_H_ */
